/*
*victor fuentes 12298
* yucely beb 12537
* hoja de trabajo 7
*/

/*
Se utilizó referencia de libro de texto y de un ejemplo realizado por Luis Antonio Sigüenza.
*/
public class Nodo<E> {
    private int frecuencia;
    private String codigo;
    private E caracter;
    private Nodo izq, der;

    
    public Nodo() {
        this.frecuencia = 0;
    }

    //Método constructor personalizado: inicializa el estado del objeto
    public Nodo(E s) {
        this.caracter = s;
        this.frecuencia = 1;
    }

    public int getFrecuencia() {
        return frecuencia;
    }
    
    //Método que devuelve el estado caracter "activo"
    public E getCaracter() {
        return caracter;
    }
    
    //Método que devuelve el estado del codigo de cada caracter
    //codigo en binario para la representacion en base 2
    public String getCodigo() {
        return codigo;
    }
    
    //Método que modifica el estado del atributo frecuencia
    //cuantas veces es que aparece 
    public void setFrecuencia(int frecuencia) {
        this.frecuencia = frecuencia;
    }
    
    //Método que modifica el estado del atributo izq
    public void setIzq(Nodo izqu) {
        izq = izqu;
    }

    //Método que modifica el estado del atributo der
    public void setDer(Nodo dere) {
        der = dere;
    }

    
    //Método que aumenta la frecuencia del caracter "activo"
    //si se repiten los caracteres, sumar a frecuencia
    public void masFrec() {
        this.frecuencia++;
    }
    
 
    //Metodo que recorre el arbol binario y despliega en pantalla la frecuencia
     //y el codigo asignado a cada caracter
    public void recorrer(Nodo nodo, String cod) {
            if(nodo.getCaracter() != null)
                System.out.println("* Caracter: " + nodo.getCaracter() + " * Frec: " + nodo.getFrecuencia() +" * Codigo: " + cod + "*");
             
            if(nodo.izq != null) {
                codigo = cod + "0";
                nodo.recorrer(nodo.izq, codigo);
                
            }
            if(nodo.der!= null) {
                codigo = cod + "1";
                nodo.recorrer(nodo.der, codigo);
            }
 }

    //Metodo que recorre el arbol completo  
    public void recorrer() {
                codigo = "0";
                recorrer(izq, codigo);

                codigo = "1";
                recorrer(der, codigo);

    }
}